import type { NavigationGuardNext, RouteLocationNormalized } from "vue-router";

import router from '@/router'

export const setupPermission = () => {
  const whiteList = ['/login', '/register']
  router.beforeEach(async (to: RouteLocationNormalized, from: RouteLocationNormalized, next: NavigationGuardNext) => {
    // 判断是否登录
    const hastoken = localStorage.getItem('token');
    if (hastoken) {
      //已登录
      if (to.path === '/login') {
        next()
      } else {
        next()
      }
    } else {
      //未登录
      if (whiteList.includes(to.path)) {
        next()
      } else {
        alert('未登录，请先登录账号')
        redirectToLogin(to, next)
      }
    }
  })
}

//重定向到登录页面
function redirectToLogin(to: RouteLocationNormalized, next: NavigationGuardNext) {
  //1、提取目标路由的查询参数：用 URLSearchParams 将 to.query 转换为一个可操作的查询参数对象  to.query 是目标路由对象的查询参数（通常是键值对形式的对象）
  const params = new URLSearchParams(to.query as Record<string, string>)
  //构造查询字符串：使用 params.toString() 将查询参数对象转换为 URL 编码的查询字符串格式
  const queryString = params.toString()
  // 拼接重定向地址：判断是否存在查询字符串：如果存在，将 to.path 和 queryString 拼接，形成完整路径（例如：/somepath?id=123&name=test）。如果不存在，仅保留路径部分（例如：/somepath）。
  const redirect = queryString ? `${to.path}?${queryString}` : to.path
  //调用 next 进行跳转：构造登录页的重定向地址：/login?redirect=...。使用 encodeURIComponent 对重定向路径进行编码，确保路径中的特殊字符不会导致错误。,调用 next 将用户导航到构造好的登录页地址。
  next(`/login?redirect=${encodeURIComponent(redirect)}`)
}
